﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.IO;
using System.Text;
using System.Drawing;
using Microsoft.Win32;

namespace monitor_server
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            AppDomain.CurrentDomain.UnhandledException += dom_UnhandledException;
            if (!FirstStart() && Dependences())                
                    Application.Run(new Form1());

            //Application.Exit();
        }

        static void dom_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            MessageBox.Show(e.ExceptionObject.ToString(), @"Unexpected error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        static private bool Dependences()
        {
            //------------------Проверка наличия .NET Framework--------------------------
            if (!File.Exists(@"C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll"))
            {
                MessageBox.Show("Файл C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727\\System.Data.dll не найден.\nРабота программы будет прекращена.");
                return false;            
            }
            //---------------Проверка наличия MySQL Connector .NET-----------------------
            /*RegistryKey findKey = Registry.LocalMachine.OpenSubKey(@"software\");
            Reg.RegFindValue retVal = Reg.Find(findKey, "MySQL Connector NET");
            findKey.Close();
            if (retVal == null)
            {
                MessageBox.Show("В регистре не найдена запись о драйвере MySQL Connector .NET.\n Попробуйте переустановить программу.");
                return false;   
            }*/
            return true;
        }

        static private bool FirstStart()
        {
            if (!Directory.Exists("resources"))
                try
                {
                    Directory.CreateDirectory("resources");
                }
                catch (UnauthorizedAccessException)
                {
                    System.Windows.Forms.MessageBox.Show("Недостаточно прав для работы в директории программы.\r\nПерезапустите программу с правами для записи.", "Ошибка");
                    return true;
                }

            /*if (!File.Exists(@"resources\DBServerName.txt"))
                try
                {
                    File.WriteAllText(@"resources\DBServerName.txt", "sus27");
                    MessageBox.Show("Укажите в файле resources\\DBServerName.txt сетевое имя устройства, на котором установлена используемая БД.");
                }
                catch (UnauthorizedAccessException)
                {
                    System.Windows.Forms.MessageBox.Show("Недостаточно прав для работы в директории программы.\r\nПерезапустите программу с правами для записи.", "Ошибка");
                    return true;
                }*/

            if (!File.Exists(@"resources\access"))
            {
                try
                {
                    File.WriteAllText(@"resources\access", " ");
                }
                catch (UnauthorizedAccessException)
                {
                    System.Windows.Forms.MessageBox.Show("Недостаточно прав для работы в директории программы.\r\nПерезапустите программу с правами для записи.", "Ошибка");
                    return true;
                }
                string su_login_str = "test1";
                string su_password_str = "test2";
                string su_access_str = "admi";
                string su_name_str = "Тест";
                int k, j = 0, h = 0;
                int[] su_login = new int[su_login_str.Length];
                int[] su_password = new int[su_password_str.Length];
                int[] su_access = new int[su_access_str.Length];
                int[] su_name = new int[su_name_str.Length];
                //int a = 10, b = 11, c = 4, d = 9, e = 0;
                int a = su_login_str.Length, b = su_password_str.Length, c = su_access_str.Length, d = su_name_str.Length, e = 0;
                byte[] su_data = new byte[43];
                k = a ^ 71;
                su_data[0] = (byte)k;
                for (int i = 0; i < su_login_str.Length; i++)
                {                    
                    k = su_login_str[i];
                    su_login[i] = k ^ 38;
                    su_data[i + 1] = (byte)su_login[i];
                    j++;
                }
                h = ++j + 1;
                k = b ^ 71;
                //su_data[11] = (byte)k;
                su_data[j] = (byte)k;
                for (int i = 0; i < su_password_str.Length; i++)
                {
                    k = su_password_str[i];
                    su_password[i] = k ^ 51;
                    //su_data[12+i] = (byte)su_password[i];
                    su_data[h + i] = (byte)su_password[i];
                    j++;
                }
                h = ++j + 1;
                k = c ^ 71;
                //su_data[23] = (byte)k;
                //su_data[su_login_str.Length + su_password_str.Length + 2] = (byte)k;
                su_data[j] = (byte)k;
                for (int i = 0; i < su_access_str.Length; i++)
                {
                    k = su_access_str[i];
                    su_access[i] = k ^ 73;
                    //su_data[24 + i] = (byte)su_access[i];
                    su_data[h + i] = (byte)su_access[i];
                    j++;
                }
                h = ++j + 1;
                k = d ^ 71;
                //su_data[28] = (byte)k;
                //su_data[su_login_str.Length + su_password_str.Length + su_access_str.Length + 3] = (byte)k;
                su_data[j] = (byte)k;
                for (int i = 0; i < su_name_str.Length; i++)
                {
                    k = su_name_str[i];
                    su_name[i] = k ^ 73;
                    //su_data[29 + i] = (byte)su_name[i];
                    su_data[h + i] = (byte)su_name[i];
                    j++;
                }
                k = e ^ 71;
                //su_data[38] = (byte)k;
                su_data[++j] = (byte)k;
                k = ';';
                su_data[++j] = (byte)k;
                k = '.';
                su_data[++j] = (byte)k;
                k = ';';
                su_data[++j] = (byte)k;
                k = ';';
                su_data[++j] = (byte)k;
                File.WriteAllBytes(@"resources\access", su_data);
            }

            if (!File.Exists(@"resources\clients.csv"))
            {
                MessageBox.Show("Перед запуском сервера заполните список областных центров мониторинга в файле Clients.csv в папке resources.");
                /*string str = "IP-адрес клиента;Область;\r\n"; 
                str += ";Брест;\r\n";
                str += ";Витебск;\r\n";
                str += ";Гомель;\r\n";
                str += ";Гродно;\r\n";
                str += ";Минск;\r\n";
                str += ";Могилев;\r\n";*/
                string str = "Область;IP-адрес клиентов (разделять запятой);\r\n";
                str += "Брест;;\r\n";
                str += "Витебск;;\r\n";
                str += "Гомель;;\r\n";
                str += "Гродно;;\r\n";
                str += "Минск;127.0.0.1;\r\n";
                str += "Могилев;;\r\n";
                int l1 = str.Length;
                File.WriteAllText(@"resources\clients.csv", str, Encoding.GetEncoding("Windows-1251"));
            }

            if (!server_work.createTables())            
                MessageBox.Show(@"Заполните списки устройств в папке resources\maps в соответсвующих файлах."); 

            return false;
        }
    }
}
